#include <config.h>
#include <disp_manager.h>
#include <string.h>
#include <stdlib.h>

/**********************************************************************
 * 函数名称： CreateVideoMem
 * 功能描述： 创建一个独立的VideoMem
 * 输入参数： iXres, iYres - 分辨率
 *            iBpp         - 每像素位数
 *            dwColor      - 默认背景色
 * 输出参数： 无
 * 返 回 值： 成功返回PT_VideoMem，失败返回NULL
 ***********************************************************************/
PT_VideoMem CreateVideoMem(int iXres, int iYres, int iBpp, unsigned int dwColor)
{
    PT_VideoMem ptVideoMem;
    int iLineBytes;
    int iTotalBytes;
    
    /* 1. 分配T_VideoMem结构体 */
    ptVideoMem = malloc(sizeof(T_VideoMem));
    if (!ptVideoMem)
    {
        DBG_PRINTF("malloc ptVideoMem error\n");
        return NULL;
    }
    
    /* 2. 设置分辨率、BPP */
    ptVideoMem->tPixelDatas.iWidth  = iXres;
    ptVideoMem->tPixelDatas.iHeight = iYres;
    ptVideoMem->tPixelDatas.iBpp    = iBpp;
    
    /* 3. 计算每行字节数和总字节数 */
    iLineBytes  = iXres * iBpp / 8;
    iTotalBytes = iLineBytes * iYres;
    ptVideoMem->tPixelDatas.iLineBytes  = iLineBytes;
    ptVideoMem->tPixelDatas.iTotalBytes = iTotalBytes;
    
    /* 4. 分配像素缓冲区 */
    ptVideoMem->tPixelDatas.aucPixelDatas = malloc(iTotalBytes);
    if (!ptVideoMem->tPixelDatas.aucPixelDatas)
    {
        DBG_PRINTF("malloc aucPixelDatas error\n");
        free(ptVideoMem);
        return NULL;
    }
    
    /* 5. 设置VideoMem的其他属性 */
    ptVideoMem->iID            = 0;       /* 使用0作为独立VideoMem的ID */
    ptVideoMem->bDevFrameBuffer = 0;      /* 不是设备帧缓冲 */
    ptVideoMem->eVideoMemState = VMS_FREE;
    ptVideoMem->ePicState      = PS_BLANK;
    ptVideoMem->ptNext         = NULL;
    
    /* 6. 用指定颜色清屏 */
    memset(ptVideoMem->tPixelDatas.aucPixelDatas, dwColor, iTotalBytes);
    
    return ptVideoMem;
}

/**********************************************************************
 * 函数名称： FreeVideoMem
 * 功能描述： 释放CreateVideoMem创建的VideoMem
 * 输入参数： ptVideoMem - 要释放的VideoMem
 * 输出参数： 无
 * 返 回 值： 无
 ***********************************************************************/
void FreeVideoMem(PT_VideoMem ptVideoMem)
{
    if (ptVideoMem)
    {
        if (ptVideoMem->tPixelDatas.aucPixelDatas)
        {
            free(ptVideoMem->tPixelDatas.aucPixelDatas);
        }
        free(ptVideoMem);
    }
}

/**********************************************************************
 * 函数名称： GetVideoMemDup
 * 功能描述： 复制一个VideoMem
 * 输入参数： ptVideoMemSrc - 源VideoMem
 * 输出参数： 无
 * 返 回 值： 成功返回复制的PT_VideoMem，失败返回NULL
 ***********************************************************************/
PT_VideoMem GetVideoMemDup(PT_VideoMem ptVideoMemSrc)
{
    PT_VideoMem ptVideoMemDst;
    
    if (!ptVideoMemSrc)
    {
        return NULL;
    }
    
    /* 1. 创建一个相同大小的VideoMem */
    ptVideoMemDst = CreateVideoMem(ptVideoMemSrc->tPixelDatas.iWidth, 
                                   ptVideoMemSrc->tPixelDatas.iHeight,
                                   ptVideoMemSrc->tPixelDatas.iBpp,
                                   0); /* 先用0作为背景色 */
    
    if (!ptVideoMemDst)
    {
        return NULL;
    }
    
    /* 2. 复制像素数据 */
    memcpy(ptVideoMemDst->tPixelDatas.aucPixelDatas, 
           ptVideoMemSrc->tPixelDatas.aucPixelDatas,
           ptVideoMemSrc->tPixelDatas.iTotalBytes);
    
    return ptVideoMemDst;
}

/**********************************************************************
 * 函数名称： ClearFullScreenAndFlush
 * 功能描述： 完全清除整个屏幕并立即刷新
 * 输入参数： dwColor - 填充颜色
 * 输出参数： 无
 * 返 回 值： 无
 ***********************************************************************/
void ClearFullScreenAndFlush(unsigned int dwColor)
{
    PT_VideoMem ptDevVideoMem = GetDevVideoMem();
    if (ptDevVideoMem)
    {
        int iXres, iYres, iBpp;
        GetDispResolution(&iXres, &iYres, &iBpp);
        
        /* 先清除屏幕，确保没有残留内容 */
        ClearRectangleInVideoMem(0, 0, iXres-1, iYres-1, ptDevVideoMem, dwColor);
        FlushVideoMemToDev(ptDevVideoMem);
        
        /* 再次刷新以确保彻底清除 */
        FlushVideoMemToDev(ptDevVideoMem);
    }
}
